////////////////////////////////////////////////////////////////////////////////

#ifndef _PLAYER_H_
#define _PLAYER_H_

////////////////////////////////////////////////////////////////////////////////

#ifndef _GAMEOBJECT_H_
#include "gameobject.h"
#endif

#ifndef _WEAPON_H_
#include "weapon.h"
#endif

#ifndef _CLIENTINPUT_H_
#include "clientinput.h"
#endif

////////////////////////////////////////////////////////////////////////////////



/** Base class for all players
*
*  @author   Anastasia Karpinska
*  @since    Nov 07th, 2009
*  @updated  Nov 12th, 2009
*/
class Player : public GameObject
{
////////////////////////////////////////////////////////////////////////////////

public:

////////////////////////////////////////////////////////////////////////////////


    /** Constructor */
    Player( int _ID );


    /** Destructor */
    virtual ~Player();


    /** Is player object */
    virtual bool IsPlayer() const;


////////////////////////////////////////////////////////////////////////////////


    /** Informs this object about collision with other object */
    virtual void Collision(const PhysicalObject* _obj);


////////////////////////////////////////////////////////////////////////////////


    /** Gets the amount of player hit points */
    size_t GetHitPoints() const;


    /** Sets the amount of player hit points */
    void SetHitPoints( size_t _hitPoints );


////////////////////////////////////////////////////////////////////////////////


    /** Gets player weapon */
    const Weapon& GetWeapon() const;


    /** Pull the trigger. Returns NULL if weapon is reloading */
    Bullet* PullTheTrigger();


    /** Processes client input, applies impulse to the object if moving */
    void ProcessInput( size_t _dt );


////////////////////////////////////////////////////////////////////////////////


    /** Sets client input */
    void SetClientInput( const ClientInput& _input, size_t _creationTime );


    /** Sets default player's state and next revive time */
    void Revive();


////////////////////////////////////////////////////////////////////////////////

private:

////////////////////////////////////////////////////////////////////////////////


    /** Player's hit points */
    size_t m_HitPoints;


    /** Players weapon */
    Weapon m_Weapon;


    /** Client input */
    ClientInput m_ClientInput;


    /** Last input time from client */
    size_t m_LastInputTime;


////////////////////////////////////////////////////////////////////////////////


    /** Get shoot direction */
    PE::Direction GetShootDirection() const;


////////////////////////////////////////////////////////////////////////////////
};


/** [Utility type]: List of players */
typedef std::list<Player> PlayersList;


////////////////////////////////////////////////////////////////////////////////

#endif

////////////////////////////////////////////////////////////////////////////////
